// 硬绑定出现绑定丢失的情况：
function sayHi() {
    console.log(this);
    console.log('Hello,', this.name);
}
var person = {
    name: 'YvetteLau',
    sayHi: sayHi
}
var name = 'Wiliam';
var Hi = function (fn) {
    // Hi.call(person, person.sayHi)执行fn的时候
    console.log(this); // 此时this执行的是 person代表Hi.call(person)修改成功
    fn(); // 但是fn(),代表单独执行fn，启用的是默认绑定，fn里面的this指向为window,因此fn()函数的this.name 指向的为全局的Wiliam

    fn.call(person); //如果要打印YvetteLau，则还需要显示绑定改变fn的this指向
}


Hi.call(person, person.sayHi);  // hello,Wiliam
Hi(person.sayHi); // 这样写同上


// Hi.call(person, person.sayHi)的确是将this绑定到Hi中的this了。
// 但是在执行fn的时候，相当于直接调用了sayHi方法(记住: person.sayHi已经被赋值给fn了，隐式绑定也丢了)，
// 没有指定this的值，对应的是默认绑定。

